数学模型

Wang Haihua

🍈 🍉🍊 🍋 🍌


层次分析法(AHP)方法的代码实现:

def ahp(judge_matrix):
    """ 计算AHP模型    
    Parameters :
    ----------
    judge_matrix : 两两判断矩阵

    Yields:
    -------
    ahp_weights : 权重
    """
    judge_matrix = np.array(judge_matrix, dtype=np.float64) # 将数据转换为numpy array格式便于后续计算
    n =  judge_matrix.shape[0] # 确定矩阵维度
    eigenvalues, eigenvectors = np.linalg.eig(judge_matrix) # 求特征值与特征向量
    value_max = eigenvalues.max() # 求最大特征值
    value_max_index = eigenvalues.argmax() # 最大特征值索引,用于提取最大特征值所对应的特征向量
    CI = (value_max-n)/(n-1) # 计算一致性指数CI
    RI_list = [0,0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49] # RI列表
    if CI/RI_list[n]>0.1: # 判断不一致性
        return 'Judgement Matrix is NOT consistent'
    else:
        print('The Max Eigenvalue is ',value_max)
        ahp_weights = eigenvectors[:,value_max_index]
        ahp_weights = ahp_weights/ahp_weights.sum() # 权重归一化
        return ahp_weights # 返回权重值

给定一个两两对比矩阵: $$\left[\begin{matrix}1 & 2 & 3\\0.5 & 1 & 5\\0.33 & 0.2 & 1\end{matrix}\right]$$

测试代码:

weights = ahp(np.array([[1,2,3],[1/2,1,9],[1/3,1/9,1]]))

结果为:'Judgement Matrix is NOT consistent'数据不一致

接下来我们调整判断矩阵: $$\left[\begin{matrix}1 & 2 & 3\\0.5 & 1 & 1\\0.33 & 1 & 1\end{matrix}\right]$$

weights = ahp(np.array([[1,2,3],[1/2,1,1],[1/3,1,1]]))

结果可接受,最大特征值为: The Max Eigenvalue is (3.0182947072896287+0j) 权重为: array([0.54994561+0.j, 0.24021087+0.j, 0.20984352+0.j])